feat(steelbore-standard): §4.3 license-file naming + §5.6 bundle license carriage — v1.50 - #46
Conversation
…nse carriage — v1.50 Skill-side sync of Standard PR #29 (Spacecraft-Software/Standard@6596880), landed at the same version and date per the two-repo rule. §4.3 gains a License file naming clause: the canonical filename is LICENSE with no extension; LICENSE.md and LICENSE.txt are non-compliant. COPYING MAY be added at project root as a symlink to LICENSE, never a second regular copy and never inside a distributable sub-unit, since archivers dereference symlinks and would ship the text twice. Where more than one license applies each text gets its own LICENSE.<TAG> file after GNU's COPYING.LESSER / COPYING.RUNTIME convention; texts are never concatenated and the SPDX expression, not the filename tag, remains the version claim. §5.6 gains License carriage: a bundle is a distribution in its own right, installed without the consumer ever seeing this repository, so the copyleft obligation to supply the license with the work lands on the bundle. Every skill directory carries a LICENSE, byte-identical to the repo root and verified by an automated gate, and it MUST be a regular file — a ../LICENSE symlink dangles the moment a directory is packaged alone, which is what bundling and the flake's per-skill cp -r do. §14 checklist rows for §4.3 and §5.6 extended to match. Masthead and frontmatter description bumped to v1.50 / 2026-08-22; description re-measured at 988 rendered characters, within the §5.6 cap (12 to spare — the description is near the limit and any future addition must trim elsewhere). This PR is the rule text only. The repo does not yet satisfy it — 34 of 44 bundles ship no license text and ten skills carry LICENSE.md — and the migration lands as its own PR. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SmZmsWzmSaXpS7bFQu3fWJ
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 73815f07a7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| | Rule | Detail | | ||
| |------|--------| | ||
| | `LICENSE` in every skill | Each skill directory MUST contain a `LICENSE` file named per §4.3, and every bundle built from that directory MUST include it. A bundle carrying no license text does not satisfy the distribution terms of any copyleft license the skill is under. | |
There was a problem hiding this comment.
Define license carriage for vendored skill trees
For vendored Android skills, this unconditional source-directory requirement cannot be satisfied without violating the repository's upstream-preservation invariant: each android-skills/<name>/ leaf lacks a license, while mkSkillPackage publishes only that leaf and therefore omits the group-level android-skills/LICENSE.txt. Adding LICENSE to every leaf would make the vendored tree non-verbatim, so §5.6 needs a vendored-skill exception or a packaging-time license-injection rule before these per-skill packages can comply.
AGENTS.md reference: AGENTS.md:L244-L253
Useful? React with 👍 / 👎.
| - [ ] **§5** Project Posture: README/NOTICE/CONTRIBUTING present; default personal-hobby stance applied; general-use carve-outs declared in project README | ||
| - [ ] **§5.5** Package distribution: `packaging/guix.scm`, `packaging/default.nix`, and `packaging/PKGBUILD` present, buildable, and carrying correct version + SHA-256 checksum (in each package manager's native format) before any release tag is pushed | ||
| - [ ] **§5.6** Skill packaging: every `SKILL.md` `description` measures ≤ 1000 rendered characters (folded scalars counted as the loader sees them, not as raw lines); the cap is enforced by CI *and* by the command that produces the bundle, not only by a local git hook — N/A for projects that ship no skills | ||
| - [ ] **§5.6** Skill packaging: every `SKILL.md` `description` measures ≤ 1000 rendered characters (folded scalars counted as the loader sees them, not as raw lines); the cap is enforced by CI *and* by the command that produces the bundle, not only by a local git hook; every skill directory carries a `LICENSE` (§4.3 naming, byte-identical to the repo root, a regular file) and every bundle ships it — N/A for projects that ship no skills |
There was a problem hiding this comment.
Exempt multi-licensed skills in the audit row
For the existing dual-licensed microsoft-rust-guidelines, this audit row requires a regular LICENSE byte-identical to the repository root, but the new multi-license rule in §5.6 requires LICENSE.<TAG> files in place of a single LICENSE. The migration therefore cannot pass the authoritative §14 audit while following §5.6; make this row explicitly accept and validate the multi-license form.
AGENTS.md reference: AGENTS.md:L47-L52
Useful? React with 👍 / 👎.
Skill-side sync of Standard#29 (merged as
6596880), landed at the same version and date per the two-repo rule inAGENTS.md.This PR carries the rule text only. The migration that makes the repo obey it is separate — see Not in this PR below.
Synced from the Standard
§4.3 — License file naming
LICENSE, no extension.LICENSE.md/LICENSE.txtare non-compliant.COPYINGMAY be added at project root as a symlink toLICENSE— never a second regular copy, never inside a distributable sub-unit (archivers dereference symlinks, shipping the text twice).LICENSE.<TAG>per license (LICENSE.GPL,LICENSE.MIT), after GNU'sCOPYING.LESSER/COPYING.RUNTIME. Never concatenated; the SPDX expression, not the filename tag, is the version claim.§5.6 — License carriage
A bundle is a distribution in its own right: consumers install the
.zip/.skillwithout ever seeing this repository, so the repo-rootLICENSEnever reaches them and the copyleft obligation to supply the license with the work lands on the bundle.LICENSE; every bundle includes it.../LICENSEdangles the moment a directory is packaged alone, which is exactly what bundling andflake.nix's per-skillcp -rdo.Also
descriptionversion bumped.Not in this PR — the repo does not yet satisfy this rule
Landing the rule before the migration is deliberate. Current state:
LICENSE.md(markdown-converted GPL — a modified license document), in three non-identical variantsspacecraft-texinfo-document/LICENSE.mdis a hand-written prose page containing no license textmicrosoft-rust-guidelinesusesLICENSE-GPL/LICENSE-MIT, to be renamed to theLICENSE.<TAG>formconstruct-cli/src/commands/ship.rs:757probes["LICENSE", "LICENSE.md", "CREDITS.md"]— it dropsLICENSE-GPL/LICENSE-MIT, the one skill with a legal need for bothAGENTS.md/CONTRIBUTING.mddocument the bundle recipe aszip … <name>/LICENSE, matching none of the files that actually existThe migration PR gives all 44 skills a byte-identical
LICENSE, repacks every bundle, teachesship.rsand the docs theLICENSE+LICENSE.*literals, and adds the equality gate to CI.Verification
Run against a clean
git archive HEADcheckout, so gitignored local files can't mask a failure:check-skill-refs.py --catalogue . .SKILL.mdreuse lintDRIFTlines.zip/.skillfile listsdescription%G? = G,+0000Prose parity with the merged Standard verified by probing all seven new normative phrases in both
SKILL.mdandThe_Steelbore_Standard.md.